import java.util.Scanner;

public class GCDCalculator {   
    // 类内容 ———— 定义了一个公开类GCDCalculator，这是Java程序的基本组织单元
    public static void main(String[] args) {
        // main方法（程序入口，主程序逻辑），是Java程序的执行起点

        @SuppressWarnings("resource")  // 添加注解忽略Scanner警告
        Scanner scanner = new Scanner(System.in);
        //创建Scanner对象，用于从标准输入（键盘）读取用户输入
        
        System.out.print("请输入第一个数: ");
        if (!scanner.hasNextInt()) {    // 先检查是否有整数输入
            // scanner.hasNextInt()：检查输入流中下一个标记是否是整数，返回boolean值
            System.out.println("错误：请输入整数！");
            scanner.next();  // 清除错误输入：读取并返回输入流中的下一个标记（以空格/换行分隔）
            return;
        }
        int num1 = scanner.nextInt();
        
        System.out.print("请输入第二个数: ");
        if (!scanner.hasNextInt()) {     // 同上验证 
            System.out.println("错误：请输入整数！");
            scanner.next();
            return;
        }
        int num2 = scanner.nextInt();
        //获取用户输入，提示用户输入两个整数，并分别存储在变量num1和num2中

        int gcd = findGCD(num1, num2);
        System.out.printf("%d和%d的最大公约数是: %d%n", num1, num2, gcd);
    } 

    public static int findGCD(int a, int b) {
        // 核心方法！！！ 计算GCD的逻辑
        // 基于欧几里得算法（辗转相除法）：
        //对于两个整数a和b，它们的最大公约数等于b和 a除以b的余数的最大公约数
        //gcd(a, b) = gcd(b, a mod b)
        // 1. 用a除以b得到余数r
        // 2. 若r为0，则b即为GCD
        // 3. 否则，令a=b，b=r，重复步骤1
        while (b != 0) {
            int temp = b;  // 临时保存b的值
            b = a % b;    // 计算余数
            a = temp;   // 更新a的值
        }
        return a;    // 当b=0时，a就是GCD

        //  执行过程示例（计算gcd(56, 98)）：
        //第一次迭代：56 % 98 = 56  → a=98, b=56
        //第二次迭代：98 % 56 = 42  → a=56, b=42
        //第三次迭代：56 % 42 = 14  → a=42, b=14
        //第四次迭代：42 % 14 = 0   → 终止，返回14
    }
}